﻿using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Xml.Serialization;

namespace FuncionesUtilitarias
{
    public static class Serializaciones
    {
        #region  Serializaciones
        #region XML
        /// <summary>
        /// Metodo que seriliza a xml un objeto de tipo T
        /// </summary>
        /// <typeparam name="T">tipo de objeto generico</typeparam>
        /// <param name="data">objeto a ser serializado</param>
        /// <returns></returns>
        public static string SerializeXml<T>(T data)
        {
            using (var memoryStream = new MemoryStream())
            {
                var serializerObj = new XmlSerializer(typeof(T));
                serializerObj.Serialize(memoryStream, data);
                memoryStream.Seek(0, SeekOrigin.Begin);
                var reader = new StreamReader(memoryStream);
                var content = reader.ReadToEnd();
                return content;
            }
        }
        #endregion
        #region JSon
        /// <summary>
        /// Metodo que seriliza a json un objeto
        /// </summary>
        /// <param name="objectToSerialize">objeto a ser serializado</param>
        /// <returns></returns>
        public static string SerializeToJsonString(object objectToSerialize)
        {
            string contenedor = string.Empty;
            using (MemoryStream ms = new MemoryStream())
            {
                DataContractJsonSerializer serializer =
                        new DataContractJsonSerializer(objectToSerialize.GetType());
                serializer.WriteObject(ms, objectToSerialize);
                ms.Position = 0;

                using (StreamReader reader = new StreamReader(ms))
                {
                    contenedor = reader.ReadToEnd();
                }
            }
            return contenedor;
        }
        #endregion
        #endregion

        #region Deserializacion
        #region XML
        /// <summary>
        /// Metodo que desearila un objeto de tipo T que se encuentra serializado XML
        /// </summary>
        /// <typeparam name="T">Tipo generico de un objeto a ser deserializado</typeparam>
        /// <param name="xml">cadena de texto serializada</param>
        /// <returns></returns>
        public static T DeserializeXML<T>(string xml)
        {
            using (var stream = new MemoryStream(Encoding.Unicode.GetBytes(xml)))
            {
                var serializer = new XmlSerializer(typeof(T));
                T theObject = (T)serializer.Deserialize(stream);
                return theObject;
            }
        }
        #endregion
        #region JSon
        /// <summary>
        /// Metodo que desearila un objeto de tipo T que se encuentra serializado JSON
        /// </summary>
        /// <typeparam name="T">Tipo generico de un objeto a ser deserializado</typeparam>
        /// <param name="jsonString">cadena de texto serializada</param>
        /// <returns></returns>
        public static T DeserializeJson<T>(string jsonString)
        {
            using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString)))
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
                return (T)serializer.ReadObject(ms);
            }
        }
        #endregion
        #endregion
    }
}
